/**
 * 
 * @param strs examples: strs = ['eat', 'ate', 'tea', 'tan']
 * @returns [['eat', 'ate', 'tea'], ['tan']]
 */
var groupAnagrams = function (strs) {
    // 检查是否为空数组
    if (strs.length === 0) return []

    const map = new Map()

    for (const str of strs) {
        // 建立长度为26的数组，原始值都为0
        // Array(length).fill(value)
        const characters = Array(26).fill(0)

        // 遍历字符串，将字母出现频率放入对应位置（类似桶排序）
        for (let i = 0; i < str.length; i++) {
            // a -- ascii:97 -- 对应characters的index为0
            // str.charCodeAt(i)返回str中第i位的ascii码值
            const ascii = str.charCodeAt(i) - 97
            characters[ascii]++
        }

        // 把字母频率作为key
        const key = characters.join("")
        // 遍历数组，字母频率作为key，对应的字符串作为value
        if (map.has(key)) {
            // map.set(key, map.get(key).push(str))
            // ES6写法
            map.set(key, [...map.get(key), str])
        } else {
            // 传入一个数组
            map.set(key, [str])
        }
    }

    const result = []
    for (const arr of map) {
        // arr[0]是map里面每一个key
        // arr[1]是map里面每一个key对应的value
        result.push(arr[1])
    }
    return result
}